<?php

namespace app\utils;

/**
 * Jwt类用于生成和解析JWT令牌
 */
class Jwt
{

    /**
     * 生成JWT令牌
     *
     * 该方法用于生成一个JSON Web Token (JWT)，其中包含了用户信息和令牌过期时间等数据
     * 它主要用于身份验证和信息交换，通过加密用户信息来确保信息的安全性
     *
     * @param int $userId 用户ID，用于标识令牌的所有者
     * @param string $username 用户名，进一步标识用户身份
     * @param int $expire 令牌过期时间，以秒为单位，默认值为'expire'，这可能是一个需要替换为具体数值的占位符
     * @param string $secret 用于编码JWT的密钥，应保持秘密，以确保JWT的安全性
     *
     * @return string 返回生成的JWT令牌字符串
     */
    public static function generateToken($userId,$invitationCode, $username, $secret="",$expire = 0)
    {
        // 获取当前时间戳，用于设置JWT的发行时间
        $now = time();

        // 构建JWT负载，包含发行者、发行时间、过期时间、用户ID和用户名
        // 这些声明用于验证令牌的有效性，并提供关于令牌所有者的必要信息
        $payload = [
            'iat' => $now, // Issued At，令牌发行时间
            'exp' => $now + $expire, // Expiration Time，令牌过期时间
            'sub' => $userId, // Subject，令牌所有者的主题，这里使用用户ID作为标识
            'username' => $username, // 自定义声明，包含用户的用户名
            'invitationCode'=>$invitationCode
        ];

        // 使用HS256算法编码JWT令牌
        // HS256是一种用于编码JWT的对称算法，选择它是因为其安全性和广泛的支持
        // 通过提供的密钥$secret对负载$payload进行编码，生成最终的JWT令牌
        return \Firebase\JWT\JWT::encode($payload, $secret, 'HS256');
    }


    /**
     * 解码JWT令牌
     *
     * 本函数使用HS256算法对JWT令牌进行解码，并返回解码后的对象
     * 这对于验证令牌的有效性以及获取令牌中的载荷数据非常有用
     *
     * @param string $token 需要解码的JWT令牌
     * @param string $secret 用于解码JWT令牌的密钥
     *
     * @return object 解码后的JWT对象
     */
    public static function decodeToken($token, $secret)
    {
        // 使用HS256算法解码JWT令牌，并返回解码后的对象
        return \Firebase\JWT\JWT::decode($token, new \Firebase\JWT\Key($secret, 'HS256'));
    }

}
